查看原文
其他

OD插件 - 支持chm帮助文档

xyjstone 看雪学苑 2022-07-01
本文为看雪论坛优秀文章
看雪论坛作者ID:xyjstone

机缘巧合看到一个帖子,讲述了制作OD插件 -- 支持chm帮助文档的分析过程,之前老师也带我们写过两个OD插件,这个插件也蛮实用的,来学习一下该插件的原理,并修复了一个小BUG。
 
原帖传送门:https://bbs.pediy.com/thread-207265.htm
 

1


插件的原理


原始OD并不支持打开chm,选择help – Select API Help File,发现只有hlp选项,且就选适用Any file选项选择了chm文件。

OD也是提示不支持chm文件,所以OD初衷只支持hlp文件,我们确实需要经常使用API帮助文档,反而OD的hlp使用频率没有那么高,所以这个插件还是比较实用的。
原帖中已经很详细的解释了制作插件的过程以及原理,不过看评论还是有和我一样的新手并不是很理解,在这里总结一下,希望可以帮些忙,提供一些理解的思路。

首先解决的是文件选择对话框的文件过滤,GetOpenFileName API是可以创建一个文件打开的对话框,参数是一个OPENFILENAME结构体,MSDN上有很详细的介绍,该结构体的第四个参数lpstrFilter可以指明文件过滤字符串。

直接hookAPI不是一个合适的选择,毕竟可能会影响其他功能,所以学长选择继续栈回溯,选择hook Select API Help File功能的初始化结构体的位置。

接下来需要解决OD不能打开chm文件的问题,说真的我这个小白API不是很熟,没用过winhel,最大的困惑的MSDN查不到啊,这个就比较纠结了,不过不要紧,我也好奇是怎么打开帮助文档的,所以自己跟了一下。

简单讲一下过程,用VS打开OD的EXE文件,找到菜单的控件ID是2504,十六进制0x9c8,接着用OD调试OD,spy++拿到了主窗口的句柄(话说微软的东西真是好用啊),确定了主窗口的过程函数。


我要找的就是WM_COMMAND响应0x9c8的分支,我发现确实调用了WinHelpA,(看来也不能迷信MSDN,人家OD标的明明白白),跟了一下API发现会判断文件的类型,如果不是hlp文件则弹框提示。


这回清楚了,做法也简单,hook WinHelpA,用ShellExecute打开chm。
 

2


莫名其妙的错误框


上面我们理清了插件的原理,当然要使用一下。不过学长帖子里的上传的插件dll不能用,需要的同学可以下载工程重新编译一下,我也会上传最终编译好的。


安装插件后,发现OD能不能正常关闭,会弹出错误对话框,提示runtime error 216 at xxxxx


这个BUG很确定是安装插件后才有的,其实并不影响OD的使用(毕竟是关闭时出现的),一开始也是忽略的,但是自己使用OD频率有很高,每次都弹框有点忍受不了啊。所以决定探索一下是什么问题。

使用OD调试OD,发现关闭OD后断在了SEH链中,我们不关心SEH怎么处理,只想知道哪里触发了异常,栈回溯,最后回溯到退出代码,却看不出来有哪些问题。

但是观察到退出时调用了遍历了所有的插件,以及在栈回溯时发现某一个SEH调用了这个插件的函数,也调用了ShellExecuteA,传入的参数指向的路径内存地址在GODUP.DLL中。


调用逻辑是:GODUP也调用了WinHelpA,因为这里注入了WinHelpA,间接调用了ShellExcuteA,但此时传入的参数不是一个路径,如果以字符串解释的话是一个空字符串,所以在调用ShellExecuteA时应该增加判断条件 。
  
更新后的关键hook代码
_export __declspec(naked) void __stdcall OpenHelp(){ char* pFilePath; DWORD pOffset; pOffset = (DWORD)OpenHelp - pfnAddressOfWinHelpA + 5; __asm { push eax mov eax, [esp + 0xc] mov pFilePath, eax } if (pFilePath != NULL) { if (strlen(pFilePath) == 0) { //直接返回 __asm { pop eax retn 16 } } ShellExecute(NULL, "open", pFilePath, "", "", SW_SHOWNORMAL); } __asm { pop eax retn 16 }}

至此我们知道了是GODUP调用WinHelpA,而我们hook了WinHelpA,导致了ShellExecute传入了错误的参数,不过这是OD退出时的逻辑,我们也不需要因此去更换hook的地址,主要简单的增加一层判断逻辑即可,反正也是要释放资源的,不影响程序的退出。

因为我的电脑上没安装VC6,只好新建了一个项目,BUG是在win10环境中发现的,不过也在win7和xp环境中测试了,都会复现。这里说明一点:只有安装GODUP插件的OD才会触发异常,当然如果其他插件也调用了WinHelpA,也有可能触发异常。


 


看雪ID:xyjstone

https://bbs.pediy.com/user-home-805235.htm

*本文由看雪论坛 xyjstone 原创,转载请注明来自看雪社区






# 往期推荐

1. Galgame汉化中的逆向:ArmArm64_ELF中汉化字符串超长修改方法

2. FartExt之优化更深主动调用的FART10

3.V8利用初探 2019 StarCTF oob 复现分析

4. 新人PWN入坑总结

5. 数据库注入wp分析心得

6. 【封神台】Sql-Labs wp



公众号ID:ikanxue
官方微博:看雪安全
商务合作:wsc@kanxue.com



球分享

球点赞

球在看



点击“阅读原文”,了解更多!

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存